package com.pattern;

import com.pattern.decorator.*;
import com.pattern.decorator.person.LeatherShoes;
import com.pattern.decorator.person.Person;
import com.pattern.decorator.person.Sneakers;
import com.pattern.decorator.person.Tshir;
import org.junit.Test;

/**
 * @Description: 装饰模式
 * @Author: whp
 * @Date: 2021-01-28 16:34
 */
public class Decorator {
/*
    装饰（Decorator）模式的定义：指在不改变现有对象结构的情况下，
    动态地给该对象增加一些职责（即增加其额外功能）的模式，它属于对象结构型模式。

    装饰（Decorator）模式的主要优点有：
    装饰器是继承的有力补充，比继承灵活，在不改变原有对象的情况下，动态的给一个对象扩展功能，即插即用
    通过使用不用装饰类及这些装饰类的排列组合，可以实现不同效果
            装饰器模式完全遵守开闭原则

    其主要缺点是：装饰模式会增加许多子类，过度使用会增加程序得复杂性。*/

    @Test
    public void testDecorator(){
        Comopent comopent=new ConcreteCompent();


        //第二次修饰
        comopent=new ConcreteDecorator2(comopent);
        //第一次修饰
        comopent=new ConcreteDecorator(comopent);

        comopent=new ConcreteDecorator3(comopent);

        //修饰执行
        comopent.opr();
    }

    @Test
    public  void testPerson(){
        Person bill=new Person("bill");
        LeatherShoes ls=new LeatherShoes();
        Sneakers ss=new Sneakers();


        ls.decorator(bill);
        ss.decorator(ls);


        ss.show();
    }
}
